package pe.gob.osce.sirenas.dao.impl;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.ResourceBundle;

import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.NoResultException;
import javax.persistence.ParameterMode;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import javax.persistence.StoredProcedureQuery;

import pe.gob.osce.sirenas.dao.ContratacionesDAOLocal;
import pe.gob.osce.sirenas.dao.convert.AcreditacionConvert;
import pe.gob.osce.sirenas.model.AcreditacionDTO;
import pe.gob.osce.sirenas.model.jpa.Acreditacion;
import pe.gob.osce.sirenas.model.servicios.BusquedaContratoDTO;
import pe.gob.osce.sirenas.model.servicios.EntidadDTO;
import pe.gob.osce.sirenas.util.ConstanteEJB;
import pe.gob.osce.sirenas.util.ModeloException;



@Stateless
public class ContratacionesDAOImpl implements ContratacionesDAOLocal {

	@PersistenceContext(unitName="pe.gob.osce.sirenas.be.pu" )
	private	EntityManager	em;
	ResourceBundle propSirenas = ResourceBundle.getBundle(ConstanteEJB.PROPERTIES);

	@Override 
	public List<EntidadDTO> listaEntidadesDTO(EntidadDTO entidadDTO) throws Exception{

		List<EntidadDTO> listaEntidadesDTO=null;
		try{
			
			StoredProcedureQuery storedProcedure = em.createStoredProcedureQuery("pkg_servicios.spu_buscar_entidad_seace_v2");
			// set parameters
			storedProcedure.registerStoredProcedureParameter("pc_nruc", String.class, ParameterMode.IN);
			storedProcedure.registerStoredProcedureParameter("pv_descripcion", String.class, ParameterMode.IN);
			storedProcedure.registerStoredProcedureParameter("pcur_lista", List.class, ParameterMode.OUT);
			storedProcedure.setParameter("pc_nruc", entidadDTO.getNumRuc());
			storedProcedure.setParameter("pv_descripcion", entidadDTO.getDescEntidad());
			// execute SP
			storedProcedure.execute();
			
			List name=(ArrayList)storedProcedure.getOutputParameterValue("pcur_lista");
			/**Realizar conversion a DTO*/			
			

		} catch (NoResultException nre) {
			listaEntidadesDTO=new ArrayList<EntidadDTO>();
			 throw new ModeloException(propSirenas.getString(ConstanteEJB.EXC_MODELO_NO_DATA));
		}catch (Exception e) {
			throw new ModeloException(propSirenas.getString(ConstanteEJB.EXC_MODELO_GENERAL_DB), e);
		}
		return listaEntidadesDTO;
	}

	@Override 
	public List<BusquedaContratoDTO> listaContratosDTO(BusquedaContratoDTO busquedaContratoDTO) throws Exception{

		List<BusquedaContratoDTO> listaContratosDTO=null;
		try{
			StoredProcedureQuery storedProcedure = em.createStoredProcedureQuery("pkg_servicios.spu_consul_contratos_seace_v2");
			// set parameters
			storedProcedure.registerStoredProcedureParameter("pc_codconsucode", String.class, ParameterMode.IN);
			storedProcedure.registerStoredProcedureParameter("pc_ncontrato", String.class, ParameterMode.IN);
			storedProcedure.registerStoredProcedureParameter("pv_descontrato", String.class, ParameterMode.IN);
			storedProcedure.registerStoredProcedureParameter("pc_ruccontratista", Long.class, ParameterMode.IN);
			storedProcedure.registerStoredProcedureParameter("pd_fechacontrato", Date.class, ParameterMode.IN);
			storedProcedure.registerStoredProcedureParameter("pv_anhioconvocado", String.class, ParameterMode.IN);
			storedProcedure.registerStoredProcedureParameter("pn_procnum", String.class, ParameterMode.IN);
			storedProcedure.registerStoredProcedureParameter("pn_codobjeto", String.class, ParameterMode.IN);
			storedProcedure.registerStoredProcedureParameter("pn_proc_tipo", Integer.class, ParameterMode.IN);
			storedProcedure.registerStoredProcedureParameter("pcur_lista", List.class, ParameterMode.OUT);
			storedProcedure.setParameter("pc_codconsucode",busquedaContratoDTO.getEntidadDTO().getCodConsucode() );
			storedProcedure.setParameter("pc_ncontrato",busquedaContratoDTO.getNumContrato() );
			storedProcedure.setParameter("pv_descontrato", busquedaContratoDTO.getDescContrato());
			storedProcedure.setParameter("pc_ruccontratista", busquedaContratoDTO.getRucContratista());
			storedProcedure.setParameter("pd_fechacontrato", busquedaContratoDTO.getFechaContrato());
			storedProcedure.setParameter("pv_anhioconvocado", busquedaContratoDTO.getAnioContrato());
			storedProcedure.setParameter("pn_procnum", busquedaContratoDTO.getNumProceso());
			storedProcedure.setParameter("pn_codobjeto", busquedaContratoDTO.getObjetoContratacionDTO().getCodObjeto());
			storedProcedure.setParameter("pn_proc_tipo", busquedaContratoDTO.getProcesoProdDTO().getCodProceso());
			// execute SP
			storedProcedure.execute();
			
			List name=(ArrayList)storedProcedure.getOutputParameterValue("pcur_lista");
			/**Realizar conversion a DTO*/			
			

		} catch (NoResultException nre) {
			listaContratosDTO=new ArrayList<BusquedaContratoDTO>();
			 throw new ModeloException(propSirenas.getString(ConstanteEJB.EXC_MODELO_NO_DATA));
		}catch (Exception e) {
			throw new ModeloException(propSirenas.getString(ConstanteEJB.EXC_MODELO_GENERAL_DB), e);
		}
		return listaContratosDTO;
	}
}
